/***链接数据库引擎***/
package db

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"fmt"
	"time"
)

//连接数据库的结构
type Config struct {
	Engine       string        //引擎类型
	Host         string        //数据库主机地址
	Database     string        //数据库
	UserName     string        //用户名
	Password     string        //密码
	LogFile      string        //数据库日志文件
	Debug        bool          //是否开启调试（若开启，则控制台打印sql语句）
	MaxOpenConns int           //最大连接数
	MaxIdleConns int           //最大空闲连接
	MaxLifetime  time.Duration //最大生存时间
}

//Engine用来创建session连接池
type Engine struct {
	db   *sql.DB
	pool []*Session
	conf *Config
}

//构建数据库连接
func NewEngine(conf *Config) (*Engine, error) {
	o := new(Engine)
	o.pool = make([]*Session,0) //连接池
	o.conf = conf
	link := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", conf.UserName, conf.Password, conf.Host, conf.Database)
	db, e := sql.Open("mysql", link)
	if e != nil {
		return nil, e
	}
	if conf.MaxOpenConns != 0 {
		db.SetMaxOpenConns(conf.MaxOpenConns)
	}
	if conf.MaxIdleConns != 0 {
		db.SetMaxIdleConns(conf.MaxIdleConns)
	}
	if conf.MaxLifetime != 0 {
		db.SetConnMaxLifetime(conf.MaxLifetime)
	}
	if e1 := db.Ping(); e1 != nil {
		return nil, e1
	}
	o.db = db
	return o, nil
}

//关闭数据库连接
func (this *Engine) Close() error {
	return this.db.Close()
}

//创建一个会话
func (this *Engine) NewSession() *Session {
	return &Session{db: this.db, conf: this.conf}
}
